package net.dgg.rz.common.utils;

import com.alibaba.fastjson.JSON;
import net.dgg.framework.tac.mq.rabbitmq.dto.DggDelayProducerParams;
import net.dgg.framework.tac.mq.rabbitmq.queue.DggMessageSendUtil;
import net.dgg.framework.tac.utils.idutil.DggKeyWorker;
import net.dgg.rz.common.constant.ScProductConstant;
import net.dgg.rz.common.constant.SystemCommonConstant;
import net.dgg.rz.common.entity.CustomerRecord;
import net.dgg.rz.common.entity.QdsUpdateScOrderVo;
import net.dgg.rz.common.entity.dto.RZUpdateProduct;
import net.dgg.rz.production.entity.ProductNode;
import net.dgg.rz.production.entity.ProductOrder;
import net.dgg.starter.call.GateWayClientUtils;
import net.dgg.tmd.foundation.platform.user.entity.UserEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;

import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;


/**
 * @Author sdx
 * @Description 生产订单更新备注操作时给订单对应的企管家推送消息(推送至MQ消费)
 * @Created data 2019/8/30 09:30
 */
public class MQMessageSendUtil {

    protected static Logger logger = LoggerFactory.getLogger(MQMessageSendUtil.class);

    //日期格式化
    private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void ucMessageSend(CustomerRecord customerRecord){
        boolean flag = DggMessageSendUtil.putMessage(SystemCommonConstant.UC_CONSUMER_QUEUE_NAME, customerRecord);
        if (!flag){
            logger.info("向UC推送消息失败");
        }
    }

    /**
     * 向企大顺发送消息
     *
     * @param productOrder 融资订单对象
     * @param node             节点对象
     * @param userEntity       用户对象
     */

    public static void qdsMessageSend(ProductOrder productOrder, ProductNode node, UserEntity userEntity) {

        //构建同步消息对象
        QdsUpdateScOrderVo qdsVo = buildQdsMsgParams(productOrder, node, userEntity);

        //将消息同步到mq
        boolean sendResult = putMessageMq(SystemCommonConstant.QDS_STATUS_SYNC, qdsVo);

        //没有同步成功
        if (!sendResult) {
            logger.info("给企大顺消息发送失败");
        }else{
            logger.info("给企大顺消息发送成功");
        }

    }

    /**
     * 企大宝由上市环境推送消息到非上市环境，用第一数据源推送
     */
    public static boolean putMessageMq(String queueName, Object data){
        DggDelayProducerParams delayProducerParams = new DggDelayProducerParams();
        delayProducerParams.setData(data);
        delayProducerParams.setQueueName(queueName);
        delayProducerParams.setSysCode(InitComponent.appId);
        delayProducerParams.setNode(InitComponent.mqIp);
        return DggMessageSendUtil.putDelayMessage(delayProducerParams);
    }

    /**
     * 消息参数构建
     *
     * @param productOrder 融资订单
     *                         //   * @param overdueStatus    是否超期 0-否 1-超期
     *                         //   * @param overdueTime      超期时间
     *                         //    * @param opertionType     操作类型（用户封装参数）
     * @param userEntity       用户
     *                         // * @param completedNode    当前最新完成节点
     * @return
     */
    protected static QdsUpdateScOrderVo buildQdsMsgParams(ProductOrder productOrder, ProductNode node, UserEntity userEntity) {

        //与企大顺生产中心同步状态对象
        QdsUpdateScOrderVo qdsVo = new QdsUpdateScOrderVo();
        qdsVo.setId(productOrder.getId());//生产中心id
        qdsVo.setOrderStatus(productOrder.getStatus());//订单状态
        qdsVo.setBeforeOrderStatus(productOrder.getBeforeStatus());//订单上一个状态
        qdsVo.setHandlerId(productOrder.getFlowUserId());//办理人id
        qdsVo.setHandlerName(productOrder.getFlowUserName());//办理人名字
        qdsVo.setBusinessCode(productOrder.getBusinessTypeCode());//业态信息
        qdsVo.setRemark(productOrder.getRemark());//备注
        qdsVo.setHandlerId(productOrder.getFlowUserId());//办理人id
        //节点不为空
        if (node != null) {
            qdsVo.setEndNodeId(node.getId());//最新完成节点id
            qdsVo.setEndNodeCode("");//最新完成节点code
            qdsVo.setEndNodeName(node.getName());//最新完成节点名称
        }

        //根据订单状态，设置特殊值
        switch (productOrder.getStatus()) {
            case ScProductConstant.RZSCORDER_STATUS02://当前节点是办理中,更新接收人信息
                qdsVo.setReceiveUserId(productOrder.getReceiverId());//接单人id
                qdsVo.setReceiveUserName(productOrder.getReceiverName());//接单人名字
                qdsVo.setReceiveTime(dateFormat.format(productOrder.getReceiveTime()));//接单时间
                qdsVo.setEndNodeId(StringUtils.isEmpty(productOrder.getLatestEndNodeId())?null:productOrder.getLatestEndNodeId());
                qdsVo.setEndNodeName(productOrder.getLatestEndNodeName());//最新完成节点名称
                break;
            case ScProductConstant.RZSCORDER_STATUS06://已退单
                qdsVo.setReturnJson(JSON.toJSONString(userEntity));//退回人
                qdsVo.setEndTime(dateFormat.format(productOrder.getAbandonReasonTime()));//退回时间
                break;
            case ScProductConstant.RZSCORDER_STATUS17://生产正常完结
                qdsVo.setEndUserJson(JSON.toJSONString(userEntity));//完结人
                qdsVo.setEndTime(dateFormat.format(productOrder.getUpdateTime()));//完结时间
                break;
            case ScProductConstant.RZSCORDER_STATUS19://生产超期完结
                qdsVo.setEndUserJson(JSON.toJSONString(userEntity));//完结人
                qdsVo.setEndTime(dateFormat.format(productOrder.getUpdateTime()));//完结时间
                break;
            case ScProductConstant.RZSCORDER_STATUS20://生产强制完结
                qdsVo.setEndUserJson(JSON.toJSONString(userEntity));//完结人
                qdsVo.setEndTime(dateFormat.format(productOrder.getUpdateTime()));//完结时间
                break;
            default:
                break;
        }

        return qdsVo;
    }

    /**
     * 广播新增产品消息
     * @param operaType
     * @param userEntity
     * @param order
     * @param oldScOrderId
     */
    public static void rzMessageSend(Integer operaType,UserEntity userEntity,ProductOrder order,Long oldScOrderId){
        RZUpdateProduct rzUpdateProduct = new RZUpdateProduct();
        rzUpdateProduct.setOperaType(operaType);
        rzUpdateProduct.setCreaterId(userEntity.getId());
        rzUpdateProduct.setCreaterName(userEntity.getRealName()+userEntity.getLoginName());
        rzUpdateProduct.setProductId(order.getProductId());
        rzUpdateProduct.setProductName(order.getProductName());
        rzUpdateProduct.setProductSpec(order.getProductName());
        rzUpdateProduct.setProductOrder(order);
        rzUpdateProduct.setOldScOrderId(oldScOrderId);
//        Map map = new HashMap();
//        map.put("rzUpdateProduct",rzUpdateProduct);
        logger.info("开始打印发送参数   >>>>>>>>>>>>>>>>>"+JSONUtils.toJSONString(rzUpdateProduct));
        boolean flag = DggMessageSendUtil.publishEvent(SystemCommonConstant.RZ_CHANGE_PRODUCT_NAME, rzUpdateProduct);
        if (!flag){
            logger.info("发送融资新增/修改产品信息失败！");
        }
        //合并上市非上市系统
//        else{
//            //延迟推送上市环境
//            sendRabbitmq(rzUpdateProduct,InitComponent.mqShIp,"融资生产",SystemCommonConstant.RZ_CHANGE_PRODUCT_NAME);
//        }
    }

//    /**
//     *   延时队列
//     * @param rzUpdateProduct
//     */
//    public static void sendRabbitmq(RZUpdateProduct rzUpdateProduct,String mqUrl,String mqName,String mqCode){
//        Map params = new HashMap();
//        params.put("type","rabbitmq");
//        params.put("delay_time",0L);
//        params.put("sys_code","iboss-rzsc");
//        params.put("target_source",mqUrl);
//        params.put("desc","旧版MQ延迟消息推送"+mqName);
//        Map dataParams = new HashMap();
//        dataParams.put("exchangeName",mqCode);
//        dataParams.put("rabbitType","fanout");
//        dataParams.put("exchangeDurable",false);
//
//        Map data = new HashMap();
//        data.put("id", DggKeyWorker.nextId());
//        data.put("data",rzUpdateProduct);
//        dataParams.put("data",data);
//        params.put("data",dataParams);
//        try {
//            logger.error("推送延迟队列参数："+params);
//            GateWayClientUtils.doPostJson( InitComponent.qdsApiUrl + "/delaymq/pushtask.do",params);
//        }catch (Exception ex){
//            logger.error("推送"+mqName+"："+ex.getMessage(), ex);
//            throw new RuntimeException("推送失败");
//        }
//    }
}
